package cn.hh.hrm.exceptionHandle;

import cn.hh.hrm.util.AjaxResult;
import org.springframework.http.HttpStatus;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.util.HashMap;
import java.util.List;

/**
 * 该类用户全局异常的处理
 * 基于aop的思想
 * @RestControllerAdvice是相当于在所有的RestController建立切面 用于处理所有的异常
 */
@RestControllerAdvice
public class GlobalExceptionHandler {
    //定义方法 处理jsr303校验的异常   所有的controller里面 如果报MethodArgumentNotValidException 会进入该方法进行处理
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public AjaxResult methodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e){
        //获取异常信息结果
        BindingResult result = e.getBindingResult();
        //获取哪些字段出现了异常
        List<FieldError> fieldErrors = result.getFieldErrors();
        HashMap<String, Object> map = new HashMap<>();
        fieldErrors.stream().forEach(fieldError->{
            String field = fieldError.getField();
            String defaultMessage = fieldError.getDefaultMessage();
            map.put(field, defaultMessage);
        });
        return AjaxResult.me().setSuccess(false).setStatusCode(HttpStatus.BAD_REQUEST.value()).setMessage(map.toString());
    }
    //处理其他运行时异常
    @ExceptionHandler(RuntimeException.class)
    public AjaxResult runtimeExceptionHandler(RuntimeException  e){
        e.printStackTrace();
        return AjaxResult.me().setSuccess(false).setMessage("系统错误，请联系管理管理员"+e.getMessage());
    }

    //处理其他运行时异常
    @ExceptionHandler(GlobalException.class)
    public AjaxResult globalExceptionHandler(GlobalException  e){
        return AjaxResult.me().setSuccess(false).setStatusCode(e.getCode()).setMessage(e.getMessage());
    }
}
